#include <stdio.h>    // 提供输入输出函数，如 printf, scanf
#include <stdlib.h>   // 提供动态内存分配函数，如 malloc

// step 1# 定义最大发动机数量与初始最大时间常量
#define MAXLEN 1000   // 最大发动机数量
#define INF 1001      // 初始设置为“不可达”的最大时间

// step 2# 全局数组，记录每台发动机的启动时间
int launches[MAXLEN];  // 启动时间数组，初始为 INF，表示未启动

// step 3# 定义队列节点结构体
typedef struct {
    int pos;   // 发动机编号位置
    int time;  // 当前发动机启动时间
} Queue;

// step 4# 广度优先搜索函数，模拟发动机启动传播过程
void bfs(int n) {
    Queue *queue = (Queue *)malloc(sizeof(Queue) * MAXLEN);  // 分配队列内存
    int front = 0;  // 队列头指针
    int rear = 0;   // 队列尾指针

    // step 5# 将所有手动启动的发动机加入队列
    for(int i = 0; i < n; i++) {
        if (launches[i] != INF) {  // 若该发动机已被手动启动
            queue[rear].pos = i;
            queue[h].time = launches[i];
            rear++;
        }
    }

    // step 6# 进行 BFS 扩散启动
    while(front < rear) {
        Queue cur = queue[front++];  // 1# 错误：原代码 front 没有 ++
        int dir[2] = {
            (cur.pos + 1 + n) % n,  // 顺时针方向
            (cur.pos - 1 + n) % n   // 逆时针方向
        };

        for (int i = 0; i < 2; i++) {
            int next = dir[i];  // 相邻发动机编号
            if (launches[next] > cur.time + 1) {  // 若未启动或可更早启动
                launches[next] = cur.time + 1;  // 更新启动时间
                queue[rear].pos = next;
                queue[rear].time = cur.time + 1;
                rear++;
            }
        }
    }
};

int main() {
    int n, e;  // step 7# n 表示发动机数量，e 表示手动启动的数量
    scanf("%d %d", &n, &e);

    // step 8# 初始化所有发动机的启动时间为 INF，表示未启动
    for(int i = 0; i < n; i++) {
        launches[i] = INF;  // 2# 原代码没有初始化
    }

    // step 9# 读取手动启动的发动机及其启动时间
    for(int i = 0; i < e; i++) {
        int t, p;  // t 启动时间，p 发动机编号
        scanf("%d %d", &t, &p);
        launches[p] = t;  // 设置手动启动时间
    }

    // step 10# 调用 BFS 模拟发动机连锁启动过程
    bfs(n);

    // step 11# 找到启动时间最大的值
    int maxTime = 0;    // 最大启动时间
    int maxCount = 0;   // 达到最大时间的发动机个数
    for(int i = 0; i < n; i++) {
        if (launches[i] > maxTime) {
            maxTime = launches[i];  // 更新最大时间
            maxCount = 0;           // 重置计数器
        } else if (launches[i] == maxTime) {
            maxCount++;             // 统计最大时间的数量
        }
    }

    // step 12# 输出达到最大启动时间的发动机个数
    printf("%d\n", maxCount);

    // step 13# 输出所有达到最大启动时间的发动机编号
    int count = 0;
    for(int i = 0; i < n; i++) {
        if (launches[i] == maxTime) {
            count++;
            if (count != maxCount)
                printf("%d ", i);
            else
                printf("%d", i);  // 最后一个编号后不加空格
        }
    }

    return 0;
}
